home *** CD-ROM | disk | FTP | other *** search
/ Apple II Magazines (PO) / Nibble Volume 09, No. 12 (1988-12)(MicroSPARC)(Side A).zip / Nibble Volume 09, No. 12 (1988-12)(MicroSPARC)(Side A).po / MERGESORT.OBJ.S < prev    next >
Text File  |  1996-12-24  |  11KB  |  491 lines

  1. *
  2. * MERGESORT.S
  3. * BY CHESTER H. PAGE
  4. * (C) 1988 MICROSPARC, INC.
  5. * CONCORD, MA 01742
  6. *
  7. TEXT      EQU $0
  8. KEEP      EQU $0 dual names for dual use of
  9. NODE      EQU $2 pointers, for readability
  10. PTR       EQU $2 of source remarks
  11. HOLD      EQU $4
  12. NEXTA     EQU $6 Pointers to next
  13. NEXTB     EQU $8  lists to be merged
  14. START     EQU $A
  15. FINISH    EQU $CE
  16. S1        EQU $1A
  17. S2        EQU $1E
  18. LETTER    EQU $D6 $40 for testing for caps
  19. MARK      EQU $D7 Holds delimiter
  20. N         EQU $EB
  21. INDEX     EQU $ED
  22. LINE      EQU $EF
  23. FLAG      EQU $F9
  24. TEMP      EQU $F9
  25. TXTLOAD   EQU $1600 Start of text area
  26. HEADLIST  EQU $8E00
  27. SLIST     EQU $9200 Stringlist, node list
  28. COUNT     EQU $9200
  29. COUT      EQU $FDED
  30.           ORG $1200
  31.           JMP TXTEND
  32.           JMP LOAD
  33.           JMP MAKELIST
  34.           JMP PRESHOW
  35. TXTEND    LDA #2 prepare parmlist for
  36.           STA $300  PRODOS GET.EOF
  37.           LDA #1
  38.           STA $301
  39.           JSR $BF00 call PRODOS MLI to get 
  40.           DB $D1     length of file
  41.           DW $300 address of parmlist
  42.           LDA $302 build pointer to storage
  43.           STA TEXT   position of EOF
  44.           CLC
  45.           LDA $303
  46.           ADC #<TXTLOAD
  47.           STA TEXT+1
  48.           LDY #0
  49.           TYA
  50.           STA (TEXT),Y load a 00 at EOF
  51.           RTS
  52. LOAD      LDA #$40 Initialize, and load text
  53.           STA LETTER
  54.           LDY #0 clear node area
  55.           STY NODE   for convenience
  56.           LDA #<HEADLIST in analysis and
  57.           STA NODE+1   debugging
  58. L0        LDA #0
  59.           STA (NODE),Y
  60.           INY
  61.           BNE L0
  62.           INC NODE+1
  63.           LDA NODE+1
  64.           CMP #$9A
  65.           BNE L0
  66.           LDA #>SLIST initialize START pointer
  67.           STA START
  68.           LDA #<SLIST
  69.           STA START+1
  70.           LDY #3
  71.           STA (START),Y
  72.           DEY
  73.           LDA #>SLIST
  74.           CLC
  75.           ADC #4
  76.           STA (START),Y
  77.           LDY #0
  78.           STY TEXT
  79.           LDA #<TXTLOAD initialize text pointer
  80.           STA TEXT+1
  81.           LDA #>SLIST
  82.           CLC
  83.           ADC #4
  84.           STA NODE
  85.           LDA #<SLIST
  86.           STA NODE+1
  87.           LDA (TEXT),Y
  88.           STA MARK save first text character
  89. L1        INY
  90.           LDA (TEXT),Y
  91.           BEQ L2 end of file
  92.           CMP MARK
  93.           BNE L1
  94.           DEY
  95.           TYA
  96.           LDY #0
  97.           STA (TEXT),Y mark replaced by length 
  98.           STA TEMP  of following string
  99.           LDA TEXT
  100.           STA (NODE),Y mark-address as node value
  101.           INY
  102.           LDA TEXT+1
  103.           STA (NODE),Y
  104.           SEC
  105.           LDA TEMP  advance text pointer
  106.           ADC TEXT
  107.           STA TEXT
  108.           LDA TEXT+1
  109.           ADC #0
  110.           STA TEXT+1
  111.           CLC
  112.           INY
  113.           LDA NODE advance node, enter link
  114.           ADC #4
  115.           STA (NODE),Y
  116.           STA TEMP
  117.           INY
  118.           LDA NODE+1
  119.           ADC #0
  120.           CMP #$9A
  121.           BCC L3
  122.           STA $1A
  123.           RTS
  124. L3        STA (NODE),Y
  125.           STA NODE+1
  126.           LDA TEMP
  127.           STA NODE
  128.           LDY #0
  129.           BEQ L1
  130. L2        LDY #0 enter terminating dummy,
  131.           TYA    a string greater than
  132.           STA (TEXT),Y   can occur in the list
  133.           INY
  134.           LDX #6
  135.           LDA #$FF
  136. DUMMY     STA (TEXT),Y
  137.           INY
  138.           INY
  139.           DEX
  140.           BNE DUMMY
  141.           LDY #2
  142.           LDX #5
  143.           LDA #$D
  144. D1        STA (TEXT),Y
  145.           INY
  146.           INY
  147.           DEX
  148.           BNE D1
  149.           LDY #0
  150.           LDA TEXT
  151.           STA (NODE),Y
  152.           INY
  153.           LDA TEXT+1
  154.           STA (NODE),Y
  155.           INY
  156.           LDA NODE link dummy to itself
  157.           STA FINISH   at address called
  158.           STA (NODE),Y   FINISH
  159.           INY
  160.           LDA NODE+1
  161.           STA FINISH+1
  162.           STA (NODE),Y
  163.           SEC
  164.           LDA FINISH
  165.           SBC #>SLIST
  166.           STA COUNT
  167.           LDA FINISH+1
  168.           SBC #<SLIST
  169.           STA COUNT+1
  170.           LSR COUNT+1
  171.           ROR COUNT
  172.           LSR COUNT+1
  173.           ROR COUNT
  174.           RTS
  175. OFFSET    LDA INDEX offset into HEADLIST
  176.           STA PTR
  177.           LDA INDEX+1
  178.           STA PTR+1 
  179.           ASL PTR
  180.           ROL PTR+1  twice the index
  181.           LDA PTR
  182.           ADC #>HEADLIST
  183.           STA PTR
  184.           LDA PTR+1
  185.           ADC #<HEADLIST
  186.           STA PTR+1
  187.           RTS
  188. FETCH     JSR OFFSET fetch node address at
  189.           LDY #0  indexed location
  190.           LDA (PTR),Y
  191.           STA HOLD
  192.           INY
  193.           LDA (PTR),Y
  194.           STA HOLD+1
  195.           RTS
  196. STORE     JSR OFFSET store node address at
  197.           LDY #0   indexed location
  198.           LDA HOLD
  199.           STA (PTR),Y
  200.           INY
  201.           LDA HOLD+1
  202.           STA (PTR),Y
  203.           RTS
  204. MAKELIST  LDA COUNT build list of nodes 
  205.           STA N   in their linked order
  206.           LDA COUNT+1
  207.           STA N+1
  208.           LDA #0
  209.           STA INDEX
  210.           STA INDEX+1
  211.           LDY #2 init pointers
  212.           LDA (START),Y
  213.           STA HOLD
  214.           INY
  215.           LDA (START),Y
  216.           STA HOLD+1
  217.           LDA #>HEADLIST
  218.           STA NODE
  219.           LDA #<HEADLIST
  220.           STA NODE+1 pointers set 
  221. M1        JSR STORE
  222.           INY
  223.           LDA (HOLD),Y
  224.           STA NEXTA
  225.           INY
  226.           LDA (HOLD),Y
  227.           STA NEXTA+1
  228.           LDA FINISH+1
  229.           STA (HOLD),Y
  230.           DEY
  231.           LDA FINISH
  232.           STA (HOLD),Y
  233.           DEC N
  234.           BNE M2
  235.           LDA N+1
  236.           BEQ SORT
  237.           DEC N+1
  238. M2        LDA NEXTA
  239.           STA HOLD
  240.           LDA NEXTA+1
  241.           STA HOLD+1
  242.           INC INDEX
  243.           BNE M1
  244.           INC INDEX+1
  245.           JMP M1
  246. SORT      LDA COUNT get NEXTA, NEXTB from
  247.           STA N    HEADLIST
  248.           LDA COUNT+1
  249.           STA N+1
  250. SO1       LDA #0
  251.           STA INDEX
  252.           STA INDEX+1
  253. SO2       JSR FETCH
  254.           LDA HOLD
  255.           STA NEXTA
  256.           LDA HOLD+1
  257.           STA NEXTA+1
  258.           INC INDEX
  259.           BNE SO3
  260.           INC INDEX+1
  261. SO3       JSR FETCH
  262.           LDA HOLD
  263.           STA NEXTB
  264.           LDA HOLD+1
  265.           STA NEXTB+1
  266.           JSR MERGE
  267.           LDY #2
  268.           LDA (START),Y
  269.           STA HOLD
  270.           INY 
  271.           LDA (START),Y
  272.           STA HOLD+1
  273.           LDA INDEX temp storage of index
  274.           STA KEEP
  275.           LDA INDEX+1
  276.           STA KEEP+1
  277.           LSR INDEX+1  halve the index
  278.           ROR INDEX
  279.           JSR STORE
  280.           LDA KEEP restore index
  281.           STA INDEX
  282.           LDA KEEP+1
  283.           STA INDEX+1
  284.           INC INDEX
  285.           BNE SO4
  286.           INC INDEX+1
  287. SO4       SEC
  288.           LDA N
  289.           SBC INDEX
  290.           STA KEEP
  291.           LDA N+1
  292.           SBC INDEX+1
  293.           BNE SO2
  294.           LDA KEEP
  295.           CMP #1
  296.           BCC SO5
  297.           BNE SO2
  298.           JSR FETCH
  299.           LDA INDEX
  300.           STA KEEP
  301.           LDA INDEX+1
  302.           STA KEEP+1
  303.           LSR INDEX+1
  304.           ROR INDEX
  305.           JSR STORE
  306.           LDA KEEP
  307.           STA INDEX
  308.           LDA KEEP+1
  309.           STA INDEX+1
  310. SO5       INC N
  311.           BNE SO6
  312.           INC N+1
  313. SO6       LSR N+1
  314.           ROR N
  315.           LDA N+1
  316.           BNE SO7
  317.           LDA N
  318.           CMP #1
  319.           BNE SO7
  320.           RTS
  321. SO7       JMP SO1
  322. MERGE     LDA START
  323.           STA NODE
  324.           LDA START+1
  325.           STA NODE+1
  326.           JSR VALUES
  327.           JSR UPDATE
  328. ME1       JSR VALUES
  329.           JSR UPDATE
  330.           LDA NODE
  331.           CMP FINISH
  332.           BNE ME1
  333.           LDA NODE+1
  334.           CMP FINISH+1
  335.           BNE ME1
  336.           RTS
  337. VALUES    LDY #0  get string addresses
  338.           LDA (NEXTA),Y
  339.           STA S1
  340.           LDA (NEXTB),Y
  341.           STA S2
  342.           INY
  343.           LDA (NEXTA),Y
  344.           STA S1+1
  345.           LDA (NEXTB),Y
  346.           STA S2+1
  347.           RTS
  348. UPDATE    JSR COMPARE
  349.           LDA FLAG
  350.           BEQ U1
  351. *LINK TO S2, POINT TO S2, ADVANCE NEXTB TO ITS LINK
  352.           LDY #2
  353.           LDA NEXTB
  354.           STA (NODE),Y
  355.           INY
  356.           LDA NEXTB+1
  357.           STA (NODE),Y
  358.           LDA NEXTB
  359.           STA NODE
  360.           LDA NEXTB+1
  361.           STA NODE+1
  362.           LDY #2
  363.           LDA (NODE),Y
  364.           STA NEXTB
  365.           INY
  366.           LDA (NODE),Y
  367.           STA NEXTB+1
  368.           RTS
  369. *as above, but for S1 and NEXTA
  370. U1        LDY #2
  371.           LDA NEXTA
  372.           STA (NODE),Y
  373.           INY
  374.           LDA NEXTA+1
  375.           STA (NODE),Y
  376.           LDA NEXTA
  377.           STA NODE
  378.           LDA NEXTA+1
  379.           STA NODE+1
  380.           LDY #2
  381.           LDA (NODE),Y
  382.           STA NEXTA
  383.           INY
  384.           LDA (NODE),Y
  385.           STA NEXTA+1
  386.           RTS
  387. COMPARE   LDY #0
  388.           STY FLAG assume S1<=S2
  389.           LDA LINE find n-th CR
  390.           CMP #1
  391.           BEQ CLOOP
  392.           TAX
  393. C1        DEX
  394.           BEQ C2
  395. C5        INY
  396.           LDA (S1),Y
  397.           CMP #$D
  398.           BNE C5
  399.           BEQ C1
  400. C2        CLC
  401.           TYA
  402.           ADC S1 advance starting address
  403.           STA S1   to line beginning
  404.           LDA S1+1
  405.           ADC #0
  406.           STA S1+1
  407.           LDA LINE find n-th CR
  408.           TAX
  409.           LDY #0
  410. C3        DEX
  411.           BEQ C4
  412. C6        INY
  413.           LDA (S2),Y
  414.           CMP #$D
  415.           BNE C6
  416.           BEQ C3
  417. C4        CLC
  418.           TYA
  419.           ADC S2 advance starting address
  420.           STA S2  to line beginning
  421.           LDA S2+1
  422.           ADC #0
  423.           STA S2+1
  424.           LDY #0
  425. CLOOP     INY  character comparison loop
  426.           LDA (S1),Y
  427.           CMP #$D
  428.           BEQ CL1
  429.           BIT LETTER
  430.           BEQ CL2
  431.           AND #$DF capitalize for comparison
  432. CL2       STA HOLD
  433.           LDA (S2),Y
  434.           CMP #$D
  435.           BEQ CL3
  436.           BIT LETTER
  437.           BEQ CL4
  438.           AND #$DF
  439. CL4       CMP HOLD compare characters
  440.           BEQ CLOOP
  441.           BCS CL1
  442. CL3       LDA #1
  443.           STA FLAG S2<S1
  444. CL1       RTS
  445. PRESHOW   LDA START
  446.           STA NEXTA
  447.           LDA START+1
  448.           STA NEXTA+1
  449. FIND.S    LDY #2 find next string
  450.           LDA (NEXTA),Y
  451.           STA NODE
  452.           INY
  453.           LDA (NEXTA),Y
  454.           STA NODE+1
  455.           STA NEXTA+1
  456.           LDA NODE
  457.           STA NEXTA
  458.           LDY #0
  459.           LDA (NODE),Y
  460.           STA HOLD
  461.           INY
  462.           LDA (NODE),Y
  463.           STA HOLD+1
  464.           LDY #0
  465.           LDA (HOLD),Y
  466.           BEQ P1
  467.           TAX
  468.           LDA FLAG non-zero when saving
  469.           BEQ PRINT  to disk
  470.           LDA MARK
  471.           JSR COUT
  472. PRINT     INY
  473.           LDA (HOLD),Y
  474.           ORA #$80 for benefit of screen
  475.           JSR COUT
  476.           BIT $C000
  477.           BPL P2
  478.           LDA $C000
  479.           CMP #$9B
  480.           BEQ DONE
  481. P2        DEX
  482.           BNE PRINT
  483.           JMP FIND.S
  484. P1        LDA FLAG  check for disk save
  485.           BEQ DONE
  486.           LDA MARK  restore closing mark
  487.           JSR COUT
  488. DONE      BIT $C010
  489.           RTS
  490.           LST NOA,NOV
  491.